/*
 * Copyright (C) 2025 Tsingteng MicroSystem
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file nfa_routing.h
 * @brief 定义路由相关接口
 */

#ifndef _NFA_ROUTING_H_
#define _NFA_ROUTING_H_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include "nci_feature.h"
#include "nfa_base.h"

#if IS_FEATURE_ON(NCI_FEATURE_ROUTING)

#define NFA_PROTOCOL_ISO_DEP NCI_RF_PROTOCOL_ISO_DEP

#define NCI_INVALID_ROUTE 0xFF
#define NCI_INVALID_POWER_STATE 0x00
#define NCI_HOST_PWR_STATE 0x11
#define NCI_OFFHOST_PWR_STATE 0x3B

#define NCI_ROUTE_DH_ID      0x00
#define NCI_POWER_STATE_HOST 0x01
#define NCI_POWER_STATE_MASK 0x3B  /* 暂时没有支持BatOff的场景，不需要0x3F */
#define MAX_EE_NUM_OF_OFFHOST 2    /* 一种offhost类型对应的最多的EE ID的数量 */

#define NCI_SECURE_NFC_POWER_STATE_MASK 0x01 /* Secure NFC 只允许DH在Screen On Unlocked场景下路由 */

typedef uint8_t tNCI_NFCEE_ID;
typedef uint8_t tNCI_EE_PWR_STATE;
typedef uint8_t tNCI_AID_INFO;

/* 修改默认路由的类型参数 */
typedef enum {
    USR_ROUTE_TYPE_AID,
    USR_ROUTE_TYPE_SYS_CODE,
    USR_ROUTE_TYPE_ISODEP,
    USR_ROUTE_TYPE_OFFHOST,
    USR_ROUTE_TYPE_NFCF,
} tNCI_USER_ROUTE_TYPE;

/* offhost路由的类型参数 */
typedef enum {
    OFFHOST_UICC,
    OFFHOST_ESE,
} tNCI_OFFHOST_ROUTE_TYPE;

typedef struct {
    uint8_t num;
    uint8_t id[MAX_EE_NUM_OF_OFFHOST];
} tNCI_OFFHOST_EE_ID;

/**
 * @brief 向路由表中添加AID路由
 *
 * @note 如果同一个AID已经存在，则更新路由表中的AID路由
 *
 * @param ee_id 路由项所属的NFCEE ID
 * @param power_state 路由项的电源状态
 * @param aid AID，NULL表示AID*
 * @param aid_len AID长度
 *
 * @return 添加成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_routing_add_aid(tNCI_NFCEE_ID ee_id, tNCI_EE_PWR_STATE power_state, uint8_t *aid, uint8_t aid_len, tNCI_AID_INFO aid_info);
/**
 * @brief 删除路由表中的AID路由
 *
 * @param aid AID，NULL表示AID*
 * @param aid_len AID长度
 *
 * @return 删除成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_routing_remove_aid(uint8_t *aid, uint8_t aid_len);
/**
 * @brief 添加SystemCode类型路由
 *
 * @param ee_id 路由项所属的NFCEE ID
 * @param power_state 路由项的电源状态
 * @param system_code SystemCode编码，高字节在前
 *
 * @return 添加成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_routing_add_sys_code(tNCI_NFCEE_ID ee_id, tNCI_EE_PWR_STATE power_state, uint16_t system_code);
/**
 * @brief 移除SystemCode类型路由
 *
 * @param system_code 需要移除的SystemCode编码，高字节在前
 *
 * @return 删除成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_routing_remove_sys_code(uint16_t system_code);
/**
 * @brief 清除指定类型的所有路由
 *
 * @param type 路由类型
 *
 * @return 清除成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_routing_clear(tNCI_ROUTING_ENTRY_TYPE type);
/**
 * @brief 清除所有路由
 *
 * @return 清除成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_routing_clear_all();
/**
 * @brief 修改默认路由设置
 *
 * @param type 需要修改的默认路由类型
 * @param route 指定的路由EE
 * @param pwr 指定路由的power status, 只对aid路由生效
 *
 * @return 成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_routing_set_user_route(tNCI_USER_ROUTE_TYPE type, tNCI_NFCEE_ID route, tNCI_EE_PWR_STATE pwr);
/**
 * @brief 清楚路由设置，恢复为config中配置的默认值
 *
 * @return 清除成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_routing_clear_all_user_route();
/**
 * @brief 更新路由表，将路由表中的路由项发送给NFCC
 *
 * @return 更新成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_routing_commit();
/**
 * @brief 获取config中配置的默认路由
 *
 * @param type 传入获取的默认路由类型
 *
 * @return 返回传入类型的默认路由
 */
uint8_t nfa_routing_get_default_route(tNCI_USER_ROUTE_TYPE type);
/**
 * @brief 获取config中配置的offhost的路由的对应EE的id
 *
 * @note 其中，一种类型的offhost对应的EE id可能存在多个
 *
 * @param ee_id 用于存放传入类型offhost对应ee id的指针结构体
 *
 * @return 返回传入类型的默认路由
 */
tNCI_STATUS nfa_routing_get_offhost_route_id(tNCI_OFFHOST_ROUTE_TYPE type, tNCI_OFFHOST_EE_ID* ee_id);
/**
 * @brief 获取支持的AID匹配模式

 * @return 返回AID匹配模式
 */
uint8_t nfa_routing_get_aid_match_mode();
#if IS_FEATURE_ON(NCI_FEATURE_EE_DH)
/**
 * @brief 设置secure NFC状态
 *
 * @note secure NFC状态下，只有screen on unlocked状态下的DH才能被路由到
 * @note 不影响Offhost的路由
 * @note 需要commit routing后生效
 * @param enable 是否开启secure NFC
 *
 * @return 设置成功返回NCI_STATUS_OK，否则返回对应错误码
 */
tNCI_STATUS nfa_routing_set_secure_nfc(bool enable);
#endif // IS_FEATURE_ON(NCI_FEATURE_EE_DH)

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif // IS_FEATURE_ON(NCI_FEATURE_ROUTING)

#endif // _NFA_ROUTING_H_
